package co.edu.udea.iw.prestamos.modelo.dao.hibernate;

import java.util.Date;
import java.util.List;

import org.hibernate.criterion.Restrictions;
import org.springframework.stereotype.Repository;

import co.edu.udea.iw.prestamos.modelo.dao.DispositivoDAO;
import co.edu.udea.iw.prestamos.modelo.dto.Dispositivo;

/**
 * DAO usando el framework Hibernate para manejar los objetos Dispositivo
 * @author Santiago Álvarez Rodríguez <santiaro90@gmail.com>
 * @since 07-07-2014
 * @version 1.0
 */
@Repository("dispositivoDao")
public class DispositivoDAOHibernate
	extends CrudDAOHibernate<Dispositivo, Integer> 
	implements DispositivoDAO {

	public DispositivoDAOHibernate() {
		super(Dispositivo.class);
	}
	
	/**
	 * @see DispositivoDAO#obtenerPorTipo(int)
	 */
	@SuppressWarnings("unchecked")
	@Override
	public List<Dispositivo> obtenerPorTipo(int tipo) {
		
		return getCurrentSession()
				.createCriteria(Dispositivo.class)
				.add(Restrictions.eq("tipoDispositivo", tipo))
				.list();
	}

	/**
	 * @see DispositivoDAO#obtenerDisponibles()
	 */
	@SuppressWarnings("unchecked")
	@Override
	public List<Dispositivo> obtenerDisponibles() {
		
		return getCurrentSession()
				.createCriteria(Dispositivo.class)
				.add(Restrictions.eq("disponible", true))
				.list();
	}

	/**
	 * @see DispositivoDAO#obtenerNoDisponibles()
	 */
	@SuppressWarnings("unchecked")
	@Override
	public List<Dispositivo> obtenerNoDisponibles() {
		
		return getCurrentSession()
				.createCriteria(Dispositivo.class)
				.add(Restrictions.eq("disponible", false))
				.list();
	}

	/**
	 * @see DispositivoDAO#obtenerDisponiblesFecha(Date)
	 */
	@SuppressWarnings("unchecked")
	@Override
	public List<Dispositivo> obtenerDisponiblesFecha(Date fecha) {
		return getCurrentSession()
				.createQuery("from Dispositivos as d "
					+ "join d.prestamos as p "
					+ "where d.disponible == true or "
					+ "p.fechaFin < :fechaFin or "
					+ "p.fechaFin is null")
				.setDate("fechaFin", fecha)
				.list();
	}

}
